{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Quiz: Initialization of feed-forward neural network model\n",
    "\n",
    "In this notebook, we demonstrate how different initialization schemes affect the accuracy of feed-forward neural network\n",
    "\n",
    "The data in this example is taken from the GEFCom2014 forecasting competition<sup>1</sup>. It consists of 3 years of hourly electricity load and temperature values between 2012 and 2014. The task is to forecast future values of electricity load. In this example, we show how to forecast one time step ahead, using historical load data only.\n",
    "\n",
    "<sup>1</sup>Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli and Rob J. Hyndman, \"Probabilistic energy forecasting: Global Energy Forecasting Competition 2014 and beyond\", International Journal of Forecasting, vol.32, no.3, pp 896-913, July-September, 2016."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Please run this notebook after completing 0_data_setup notebook."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import os\n",
    "import warnings\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import datetime as dt\n",
    "from glob import glob\n",
    "from collections import UserDict\n",
    "from common.utils import load_data, mape\n",
    "from IPython.display import Image\n",
    "%matplotlib inline\n",
    "\n",
    "pd.options.display.float_format = '{:,.2f}'.format\n",
    "np.set_printoptions(precision=2)\n",
    "warnings.filterwarnings(\"ignore\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Load the data from csv into a Pandas dataframe"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>load</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2012-01-01 00:00:00</th>\n",
       "      <td>2,698.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 01:00:00</th>\n",
       "      <td>2,558.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 02:00:00</th>\n",
       "      <td>2,444.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 03:00:00</th>\n",
       "      <td>2,402.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 04:00:00</th>\n",
       "      <td>2,403.00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                        load\n",
       "2012-01-01 00:00:00 2,698.00\n",
       "2012-01-01 01:00:00 2,558.00\n",
       "2012-01-01 02:00:00 2,444.00\n",
       "2012-01-01 03:00:00 2,402.00\n",
       "2012-01-01 04:00:00 2,403.00"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "energy = load_data('data')[['load']]\n",
    "energy.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Create train, validation and test sets\n",
    "\n",
    "We separate our dataset into train, validation and test sets. We train the model on the train set. The validation set is used to evaluate the model after each training epoch and ensure that the model is not overfitting the training data. After the model has finished training, we evaluate the model on the test set. We must ensure that the validation set and test set cover a later period in time from the training set, to ensure that the model does not gain from information from future time periods.\n",
    "\n",
    "We will allocate the period 1st November 2014 to 31st December 2014 to the test set. The period 1st September 2014 to 31st October is allocated to validation set. All other time periods are available for the training set."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "valid_start_dt = '2014-09-01 00:00:00'\n",
    "test_start_dt = '2014-11-01 00:00:00'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA40AAAH4CAYAAADuJAhiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzs3XmcHGWdP/BP5ZAjBEEQ5Vg26Aqy\nCARk+YmAC66KHHLrj0NXUURBgfUnShRQzjUKcoT7JkBCgJCQhCF3Jvc5k0wmmUkmM5PMZI7Mfd/T\n3c/vj+6eqa6uqq6qrrs/79crr8x01/FMnc/3OSUhBIiIiIiIiIjUjPE6AURERERERORfDBqJiIiI\niIhIE4NGIiIiIiIi0sSgkYiIiIiIiDQxaCQiIiIiIiJNDBqJiIiIiIhIE4NGIiIiIiIi0sSgkYiI\niIiIiDQxaCQiIiIiIiJN47xOgBeOPvpoMWnSJK+TQURERERE5InCwsIWIcTnjSybk0HjpEmTUFBQ\n4HUyiIiIiIiIPCFJUrXRZdk8lYiIiIiIiDQxaCQiIiIiIiJNDBqJiIiIiIhIU072aSQiIiIiIn8a\nHh5GbW0tBgYGvE5KKBx88ME44YQTMH78eMvbYNBIRERERES+UVtbi4kTJ2LSpEmQJMnr5ASaEAKt\nra2ora3FSSedZHk7bJ5KRERERES+MTAwgKOOOooBow0kScJRRx2Vda0tg0YiIiIiIvIVBoz2seNY\nMmgkIiIiIiIiTQwaiYiIiIiIEjo6OvDCCy+YXu+yyy5DR0eHAynyHoNGIiIiIiKiBK2gMRqN6q73\n6aef4ogjjnAqWZ7i6KlERERERORLDy0oQWl9l63b/PfjDsdff3Ca5vdTpkxBZWUlJk+ejPHjx+Ow\nww7Dsccei6KiIpSWluLqq69GTU0NBgYGcPfdd+O2224DAEyaNAkFBQXo6enBpZdeigsuuADr16/H\n8ccfj3nz5uGQQw6x9e9wE2saiYiIiIiIEqZOnYovf/nLKCoqwuOPP47NmzfjscceQ2lpKQDgjTfe\nQGFhIQoKCjBt2jS0trambaO8vBy/+c1vUFJSgiOOOAIfffSR23+GrVjTSEREREREvqRXI+iWc889\nN2WOw2nTpmHu3LkAgJqaGpSXl+Ooo45KWeekk07C5MmTAQBf//rXUVVV5Vp6ncCgkYiIiIiISMOE\nCRNGfl65ciWWLVuGDRs24NBDD8VFF12kOgfiQQcdNPLz2LFj0d/f70pancLmqURERERERAkTJ05E\nd3e36nednZ048sgjceihh2L37t3YuHGjy6nzBmsaiYiIiIiIEo466iicf/75+NrXvoZDDjkEX/jC\nF0a++/73v4+XXnoJZ5xxBk455RR84xvf8DCl7pGEEF6nwXXnnHOOKCgo8DoZRERERESksGvXLpx6\n6qleJyNU1I6pJEmFQohzjKzP5qlEREQ+9/O3tuCrDyz0OhlERJSj2DyViIjI51bsbvI6CURElMNY\n00hERERERESaGDQSERERERGRJgaNREREREREpIlBIxEREREREWli0EhERORTg5EoJk3J8zoZRESk\n47DDDgMA1NfX4/rrr1dd5qKLLkKmKf+efvpp9PX1jfx+2WWXoaOjw76EZoFBIxERkU919Ue8TgIR\nERl03HHHYfbs2ZbXVwaNn376KY444gg7kpY1TrlBRETkQ5FoDBVNPV4ng4jIWwunAA077N3mF08H\nLp2q+fW9996Lf/3Xf8Udd9wBAHjwwQchSRJWr16N9vZ2DA8P49FHH8VVV12Vsl5VVRWuuOIK7Ny5\nE/39/bjllltQWlqKU089Ff39/SPL3X777diyZQv6+/tx/fXX46GHHsK0adNQX1+Piy++GEcffTTy\n8/MxadIkFBQU4Oijj8aTTz6JN954AwBw66234n/+539QVVWFSy+9FBdccAHWr1+P448/HvPmzcMh\nhxxi7/ECaxqJiIh8aerC3bjx1Y1eJ4OIKOfccMMNeP/990d+/+CDD3DLLbdg7ty52Lp1K/Lz8/H7\n3/8eQgjNbbz44os49NBDUVxcjPvuuw+FhYUj3z322GMoKChAcXExVq1aheLiYtx111047rjjkJ+f\nj/z8/JRtFRYW4s0338SmTZuwceNGvPrqq9i2bRsAoLy8HL/5zW9QUlKCI444Ah999JHNRyOONY1E\nREQ+tGFvq9dJICLynk6NoFPOOussNDU1ob6+Hs3NzTjyyCNx7LHH4ne/+x1Wr16NMWPGoK6uDo2N\njfjiF7+ouo3Vq1fjrrvuAgCcccYZOOOMM0a+++CDD/DKK68gEongwIEDKC0tTfleae3atbjmmmsw\nYcIEAMC1116LNWvW4Morr8RJJ52EyZMnAwC+/vWvo6qqyqajkIpBIxERkQ9FY9ol2ERE5Kzrr78e\n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\nABoBbAfwbREZIyItAO7IvNYM4HEAt+uOvQTAOAAdAJYDOEdE1gKAjWOJiIiIiIioCIFET1VKvY10\n5U9zj4j8BcAsAEMAPKOU+g4AiMglAF4WkR6l1LMADgewVSn1KoBXReRGAFsA3AdgvwLHEhERERER\nURFCmdMoIm0AxgN4BkAvgKe0bZkK5vMAekWkCcAI/fbMz72Zny2PNXnPY0XkcRF5fOfOnd5+ICIi\nIiIiooQKvNIoIhUAvgnga5newDoArxt2ex1AfWYbDNu1bShwbBal1A1KqT6lVN/QoUOL+xBERERE\nREQlItBKo4ikAHwdwAcATsq8/BaABsOuDQDezGyDYbu2rdCxREREREREVKTAKo0iIgBuAtAGYJNS\n6sPMpmcATNPtVwugC+m5iq8CeFG/PfPzM4WO9eljEFHEHbekEzdvmR12MoiIiIgSI8iexi8BmAhg\no1LqXd3rdwKYLCKbRKQawEUAntYFsrkVwIUi0iQiPQCOAXCLzWOJqMSct34ilve0hp0MIiIiosQI\nap3GDgDHAZgO4CUReSvz71Cl1E4AmwBcAeBVAHMBHKQ7/GKkg9u8AOBhANcope4DABvHEhERERER\nURFEKRV2GgLX19enHn/88bCTQUREREREFAoReUIp1Wdn31CW3CAiIiIiIqJ4YKWRiIiIiIiILLHS\nSERERERERJZYaSQiIiIiIiJLrDQSERERERGRJVYaiYiIiIiIyBIrjURERERERGSJlUYiIiIiIiKy\nxEojERERERERWWKlkYiIiIiIiCyx0khERERERESWWGkkIiIiIiIiS6w0EhERERERkSVWGomIiIiI\niMgSK41ERERERERkiZVGIiIiIiIisiRKqbDTEDgReRPAH4o8TSOA1z1Ijl4LgJc9PifgfVr9+Ox+\nnDcu6YzTOf06bymfMw75ntdSPM7p13njck4/zutXOv3I93H47HE5p1/njcs5/ThvXNLp1zmj+qyf\noJSqt7WnUqrk/gF43INz3BDFdAWRVj8+eymnM07njFNaY3TOyOd7XkvxOGec0hqXz+9jOj3P93H4\n7HE5Z5zSGpfPH5d0+njOSD7rnaSLw1PduzvsBDjgdVr9+uylms44ndOv85byOf3iZVp5LcXjnH6d\nNy7n9OO8pZrn/ThfnM7p13njck4/zhuXdPp1Tr8EltZSHZ76uFKqL+x0GEU1XUTkH+Z7otLDfE9U\n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\nDgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x19acde26320>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "energy[energy.index < valid_start_dt][['load']].rename(columns={'load':'train'}) \\\n",
    "    .join(energy[(energy.index >=valid_start_dt) & (energy.index < test_start_dt)][['load']] \\\n",
    "          .rename(columns={'load':'validation'}), how='outer') \\\n",
    "    .join(energy[test_start_dt:][['load']].rename(columns={'load':'test'}), how='outer') \\\n",
    "    .plot(y=['train', 'validation', 'test'], figsize=(15, 8), fontsize=12)\n",
    "plt.xlabel('timestamp', fontsize=12)\n",
    "plt.ylabel('load', fontsize=12)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data preparation - training set\n",
    "\n",
    "For this example, we will set *T=6*. This means that the input for each sample is a vector of the prevous 6 hours of the energy load. The choice of *T=6* was arbitrary but should be selected through experimentation.\n",
    "\n",
    "*HORIZON=1* specifies that we have a forecasting horizon of 1 (*t+1*)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAt4AAADUCAYAAACrkCQQAAAAAXNSR0IArs4c6QAAAARnQU1BAACx\njwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABrKSURBVHhe7d3djxxVesfx/Ik2LA7LS4IgwYQN\nYdEi3hYJ0IogBBdAhIwUEZIILWBQLHFD4hU3kYKQpQiBN76IJS58gSGSr+wbX1X0tPpAbfN7putU\nnXqeMz3fj/SVGc/Y5zA13f10dc34zwYAAAAAq2PwBgAAAAIweAMAAAABGLwBAACAAAzeAAAAQAAG\nbwAAACAAgzcAAAAQgMEbAAAACMDgDQAAAARg8AYAAAACMHgDAAAAARi8AQAAgAAM3gAAAEAABm8A\nAAAgwPzB+38+pqlFUuuTXxS1NvllUXshHYBj7V+//I4m1hKDd0SR1PrkF0WtTX5Z1F5Il0Xthfwy\nqH2QXxI1YJKuJQbviCKp9ckvilqb/LKovZAui9oL+WVQ+yC/JGrAJF1LDN4RRVLrk18UtTb5ZVF7\nIV0WtRfyy6D2QX5J1IBJupYYvCOKpNYnvyhqbfLLovZCuixqL+SXQe2D/JKoAZN0LTF4RxRJrU9+\nUdTa5JdF7YV0WdReyC+D2gf5JVEDJulaYvCOKJJan/yiqLXJL4vaC+myqL2QXwa1D/JLogZM0rXE\n4B1RJLU++UVRa5NfFrUX0mVReyG/DGof5JdEDZika4nBO6JIan3yi6LWJr8sai+ky6L2Qn4Z1D7I\nL4kaMEnXEoN3RJHU+uQXRa1NflnUXkiXRe2F/DKofZBfEjVgkq4lBu+IIqn1yS+KWpv8sqi9kC6L\n2gv5ZVD7IL8kasAkXUsM3hFFUuuTXxS1NvllUXshXRa1F/LLoPZBfknUgEm6lhi8I4qk1ie/KGpt\n8sui9kK6LGov5JdB7YP8kqgBk3QtMXhHFEmtT35R1Nrkl0XthXRZ1F7IL4PaB/klUQMm6Vpi8I4o\nklqf/KKotckvi9oL6bKovZBfBrUP8kuiBkzStcTgHVEktT75RVFrk18WtRfSZVF7Ib8Mah/kl0QN\nmKRricE7okhqffKLotYmvyxqL6TLovZCfhnUPsgviRowSdcSg3dEkdT65BdFrU1+WdReSJdF7YX8\nMqh9kF8SNWCSriUG74giqfXJL4pam/yyqL2QLovaC/llUPsgvyRqwCRdSwzeEUVS65NfFLU2+WVR\neyFdFrUX8sug9kF+SdSASbqWGLwjiqTWJ78oam3yy6L2Qrosai/kl0Htg/ySqAGTdC0xeEcUSa1P\nflHU2uSXRe2FdFnUXsgvg9oH+SVRAybpWmLwjiiSWp/8oqi1yS+L2gvpsqi9kF8GtQ/yS6IGTNK1\nxOAdUSS1PvlFUWuTXxa1F9JlUXshvwxqH+SXRA2YpGuJwTuiSGp98oui1ia/LGovpMui9kJ+GdQ+\nyC+JGjBJ1xKDd0SR1PrkF0WtTX5Z1F5Il0XthfwyqH2QXxI1YJKupRM7eL/w5N8Mp06dmpR9rPo7\nJhdJrX9g/e1f/8XmuDz0l/fI91cVRa19jPrvC28O//C73wxPPfZXf3LbsGPw6m//bvjPD16Tf252\nWdRejlH/91//PLz/xm83x+mXf37Xj8fJ/tvux/7t3Evyz80qi9rLMc9uX3bc7L7N/lt9zOwyqH2Q\nXxI1YB5aL//Tp8Mvztwt31dTSyd28B4/KO3rH199Wv4dk4uk1j+gbMgrx2XxEyIrilr7mGQD9/j2\n4GUfp/78rLKovRyDbOCeepxsKLePV39PVVnUXo5Z9vn/9/f+fnN/Zk9ex8dHffyiMqh9kF8SNWAe\nUk+/+s6Ptyv1/ppa6mrwtjsjG3LtgaH5GbRR9nfbgbDhW72/eZHU+guzMzE25Nqv6v1R2dm6ciOy\nmuwnilq7QeVMtJ0pU+9vkd0ebTiwz/fu2TgbHsorEM2OiZVF7WVhEcfIjkM5BjbM2dvj4dr2MH6V\n71g9ad2l9tKotY+V3YeNj8NudltTf25RGdQ+OihqxqguiRowa3r+jX8ZHv71M8NvfveGfH9W71z8\n42Zf49uW+riaWupq8B4/eKj3t6qcGbIHKPX+5kVS6y/I7qjKMcm8o7IHxLKPpvuJotZuUPlaXuUB\ne9u+z7N9jZThu9mT2SxqLwuLOEY2TNhA97//8Y58f2n8itG+j91bFrWXRq19rMZnt+02Y+vZ7asM\n4/a2+nOLyqD20UFRM0Z1SdSAWVP5XPY0eNuTAbu0xPZ1/0OP/LhH9bE1tdTV4G0PHvYJWvMByipD\nQtPrHY8qklp/QfagUL5w1fsjsgGhXBpUHhib7SeKWrtBdluxz8Xiy6EWNn5AO1ZPiHapvSws4hjt\nvhLhNX4ivfjViSxqL41a81jZ/ZgN2PZ5333SU+7f7HY0/v0mZVD76KCoGaO6JGrArKncl2QP3naG\n2y4r+eX9D2z2Y4O3vW3Xd5c9qj9XU0tdDd4RD1B2h1cOxPil2FWLpNZfUPYd1fhsqp2tswct++9m\nLwVHUWs3qHwtNxl2F9Z0L1nUXhbW0zGyylnXxfezWdReGpVxrMaPSbsDeZMyqH10UMSMMaskasCs\nqXzdZg/etn7Zy6+efml488IXm99n8J5Q+QSteadXrhNuNrhNKZJaf0HZd1Rl6C6Df3mpvNlLslHU\n2guz24l9Liz1/ujKXhi8f6q3Y2QxeOuyjlV5tWi17znKoPbRQeX4rjljzCqJGjBrKp/PFoP3a7//\nw2ZQtrPX6v1HZWe3xwN3icFbtPvNcl72QKH+/JzK4BY6SEZS61c0Pvuyr1XOzowqx8qG7/LqRBka\nml0mFEWtPaPxNbpHZR+n/vxaja/Bn3rZw5FlUXuprNdjVCrrL74NZVF7mVkPx6pcPtfkG15VGdQ+\nEsqYMWaVRA2YRzUeZPdlH6v+Dq8HH31i1p87KgZv0dQ7vZZ3SOVauibDwdQiqfUrmnpHtdrZmW3l\na2M8dI+vT2029EdRa8+oPPHYV7OfLjIxeyJr6zZ7AMui9lJZr8fIGl+Lv/g2lEXtZWY9HKvVX1XM\noPaRUMaMMaskasA8KgbvNrq51KTcQNa8AZSzcuHPbiOp9WdWhvC1h+zdyteCrTt+glReCm66nyhq\n7YWVoSFjgBtnx6g8oW32zWFZ1F4W1MsxKu1eurWoLGovDco6VramtdrlDxnUPpKLmDFml0QNmDWV\nr90Wl5oweE+hvngWVB4Q1rzTK2fldrOhwW6MzS5f2C2SWn9mq78EKhoP+7uvSpTj12RoKEVRay9o\nfPY/9NWbnWxYKEO3PbCpj5lVFrWXmfVyjErjs39N9pNF7WVhWcfK1irrllf2mpdB7SO5iBljdknU\ngFlT+dpl8K7TzeBdPjlrftNDueEdlZ31aH7HG0mtP7Pob6w8aui2VtlPFLX2gsrZf0u9f81sbXvw\nKsej+TGxsqi9zCzzGO02HrqbnWDIovaysKxjZbcjW9Mem9T7m5RB7SO5cnzXnDFml0QNmDWVzymD\nd50uBu+oOz3vBme/P35gssGv6TcORlLrz6x8PiLuqPYN3VY5s9p0P1HU2gta5ey/6KhvtrUnqfaq\nyCrfZJtF7WVmUcfoqOzYjJ8gNX1VL4vay8KyjlV53Gn6atFuGdQ+EouaMWaXRA2YNZXPKYN3nS4G\n73Knt+qz/gnZwFeGu6Z3wJHU+jMa31Gt9hLotilDt/3+KvuJotZeUBmmmv1YRadybHazoduGhdWe\nlGVRe5lZ1DHysuvty/3ZsX8lb0ztZWFZxyrkuvIMah+J9TJjuCVRA2ZN9jm1GLzrdDF42zXE9onZ\nd6c3Hr6Oask1yeUGajU7kxdJrT+jmpdAy4P7UdnHqD87Zei2ysc1v+OMotZeUPmc7/tmxnIc9zXl\ngd+e8NigbR9rx6H82aZnUUtZ1F5mlnGMrN2z3Ha/usqT5yxqLwvLuj2Vj2/+pGhcBrWPxKbOGGkl\nUQNmTeXrd+rgXT5+bjacq7/Xi8H7iMqz/n0P4FPv9Gx4Vn9+SuOX1pudzYuk1p/R1JdApz4ZUq8g\nlDX2Dd3W1P1UF0WtPbPx1+i+J4flAWdfc77Wx7fHZj/NpJRF7WVGWcfI7vvKEGn3q6u9ImFlUXtZ\nUNaxso8pH6/e36wMah+JTZ0x0kqiBsyaytcvg3ed9ME77Fl/RWU/zR60Iqn1Z1TOaE49y1ZbzdBt\nrbafKGrtmdmQWz536v2RleNoD2zq/bPLovYyo+hjZLeh8asQNoCvcpZ7XBa1lwVl3Z7Kq6vqpETT\nMqh9JNXjjPGzkqgBs6byeeVSkzrpg3e507PU+zMq+zmpg/f4jmqNM2bjMz1LW7y/KGrtmdnLpfb/\nvvoD9oTGx3Lf2cKqsqi9zCjyGNlZvHKW24bvsOEii9rLgrJuT7aerbv65Q8Z1D6S6nHG+FlJ1IBZ\nU/m8MnjXSR+8w571T2yVoTOSWr+y8TCl3r+0csxbpP7+qqKotWdWHrDt86jeH9n4a6XZ7cXKovYy\no6hjVF5xSPl6yKL2sqCs21N5smSDoXp/szKofSRVHm96mTFkSdSAWVO572HwrpM+ePc0RFirPDuO\npNavrLc7qlX3E0WtPbPy9dl00J3ZePDmjPdPRRyj2su1mpdF7WVBEcdqNzteZd2mtxtVBrWPpHqb\nMWRJ1IBZU/kaZvCukz54hz3rn1i5kS75ySg/K5Jav7LevgN81f1EUWvPaPyAvfo1vBMqP22m+fWx\nWdReKos4RuXyiLSh28qi9jKzrNvTarcbVQa1j6R6mzFkSdSAWdMvzty9+dwyeNdJHbzXvpa4tnJn\n2Hw/kdT6lZVv0urlDMGq35EeRa09o56uV7Tbbzk2x/anzexSe6ls7WM0fpUh9X4zi9rLzLJuT+WJ\nU9MTPF4Z1D4S6m3GcEuiBsyayrDM4F0ndfCOeACZehZj/KPRmp9ZjaTWr6x8HnoYvMd3nKuc2Yui\n1p5RuezGUu9f2tSfGmPHpTxBszNKU29nk8ui9lLZ2seoXGISMrQdVRa1l5mtfay8Qk9uZFD7SKib\nJ6n7SqIGzJrKsPzwr5+R76+JwXsK9cVT2XioKndA9nt2ZrPV2U17cLLLR+zv2x3c7G37/XLWzmp+\n5s6KpNavrDwo2OeuDFR2ZijkQWKn8R2nev/ioqi1ZzQ+Q1ceSOwaUTs2S5+YlM+13R7syae9PR6o\n7b/t9+x95eXb1S51yKL2Utmax8gqf/cqrwDVlEXtZWZrHyuv3TVXLYPaR0IRM0aTkqgBs6anX/3p\nZ+Dbf5fff+ncR8ObF774k4/d12u//8NmUH7n4h/l++fE4O1UrqnerdUdUhkQ9mUfZ3fC6u9YXCS1\nfmV2B6U+R+WOK7Kyl1W+sdKKotaekT1oeF/T6uNrsgeiqbcXy47Jat8YlkXtpbI1j5HdL6q/d2rq\n75xdFrWXma15rLzGx9DWVx/TtAxqH0mtPWM0KYkaMGuyIfn+hx6Rn9+WZ67nxuDtZHc85ZvnLDvb\n2nLAs2HaztCpG5+tZWe4V3/mG0mtP6PxWU07A2qfp5AHiZ3K10bzy39KUdTaM7MzceVVCcu+tls9\nabRjbLcHO967txn7erDfs9vnmmcDN2VRe5nRWsfIe1I8JduD+jtnl0XtZUFr3p5U5bJGW1O9v3kZ\n1D6SWnvGaFISNWDWZsP3r55+6cdvtLRf7dKT2jPea8TgfZKLpNYnvyhqbfLLovZCuixqL+SXQe2D\n/JKoAZN0LTF4RxRJrU9+UdTa5JdF7YV0WdReyC+D2gf5JVEDJulaYvCOKJJan/yiqLXJL4vaC+my\nqL2QXwa1D/JLogZM0rXE4B1RJLU++UVRa5NfFrUX0mVReyG/DGof5JdEDZika4nBO6JIan3yi6LW\nJr8sai+ky6L2Qn4Z1D7IL4kaMEnXEoN3RJHU+uQXRa1NflnUXkiXRe2F/DKofZBfEjVgkq4lBu+I\nIqn1yS+KWpv8sqi9kC6L2gv5ZVD7IL8kasAkXUsM3hFFUuuTXxS1NvllUXshXRa1F/LLoPZBfknU\ngEm6lhi8I4qk1ie/KGpt8sui9kK6LGov5JdB7YP8kqgBk3QtMXhHFEmtT35R1Nrkl0XthXRZ1F7I\nL4PaB/klUQMm6Vpi8I4oklqf/KKotckvi9oL6bKovZBfBrUP8kuiBkzStcTgHVEktT75RVFrk18W\ntRfSZVF7Ib8Mah/kl0QNmKRricE7okhqffKLotYmvyxqL6TLovZCfhnUPsgviRowSdcSg3dEkdT6\n5BdFrU1+WdReSJdF7YX8Mqh9kF8SNWCSriUG74giqfXJL4pam/yyqL2QLovaC/llUPsgvyRqwCRd\nSwzeEUVS65NfFLU2+WVReyFdFrUX8sug9kF+SdSASbqWGLwjiqTWJ78oam3yy6L2Qrosai/kl0Ht\ng/ySqAGTdC0xeEcUSa1PflHU2uSXRe2FdFnUXsgvg9oH+SVRAybpWmLwjiiSWp/8oqi1yS+L2gvp\nsqi9kF8GtQ/yS6IGTNK1xOAdUSS1PvlFUWuTXxa1F9JlUXshvwxqH+SXRA2YpGuJwTuiSGp98oui\n1ia/LGovpMui9kJ+GdQ+yC+JGjBJ1xKDd0SR1PrkF0WtTX5Z1F5Il0XthfwyqH2QXxI1YJKuJQbv\niCKp9ckvilqb/LKovZAui9oL+WVQ+yC/JGrAJF1LDN4RRVLrk18UtTb5ZVF7IV0WtRfyy6D2QX5J\n1IBJupbmD94AAAAAJmPwBgAAAAIweAMAAAABGLwBAACAAAzeAAAAQAAGbwAAACAAgzcAAAAQgMEb\nAAAACMDgDQAAAARg8AYAAAACMHgDAAAAARi8AQAAgAAM3gAAAEAABm8AAAAgAIM3AAAAEIDBGwAA\nAAjA4A0AAAAEYPAGAAAAAjB4AwAAAAEYvAEAAIAADN4AAABAAAZvAAAAIACDNwAAABCAwRsAAAAI\nwOANAAAABGDwBgAAAALMHrw//vjj7X8BAAAA2Gf24H3mzJnh9u3b27cAAABQw+Yom6dwcswevO+7\n777h5s2b27cAAABQw+Yom6dwcswevB988MHhxo0b27cAAABQw+Yom6dwcswevB955JHh+++/374F\nAACAGtevX9/MUzg5Zg/ejz322HDt2rXtWwAAAKhhc5TNUzg5Zg/eTz755HD16tXtWwAAAKhhc5TN\nUzg5Zg/ezz777HDlypXtWwAAAKhhc5TNUzg5Zg/eL7/88nDp0qXtWwAAAKhhc5TNUzg5Zg/eb7/9\n9nDx4sXtWwAAAKhhc5TNUzg5Zg/e77///nD+/PntWwAAAKhhc5TNUzg5Zg/en3322XDu3LntWwAA\nAKhhc5TNUzg5Zg/eX3311fDiiy9u3wIAAEANm6NsnsLJMXvw/u6774azZ89u3wIAAEANm6NsnsLJ\nMXvwNnffffdw69at7VsAAACYwuYnm6NwsiwavJ977rnhm2++2b4FAACAKWx+sjkKJ8uiwfu9994b\nPvzww+1bAAAAmOKjjz7azFE4WRYN3pcvXx6eeuqp7VsAAACYwuYnrho4eRYN3ubxxx8fLly4sH0L\nAAAAR7G5yeYnnDyLB+8vvvhieOCBB4bTp08TEaVn90d2vzTG/RQR9ZS6n8LJsHjwBoCeqDNJvDIH\nAOgBgzeAg2PXTtr3oBi+FwUA0AsGbwAHx37aUvlpAfar/fQAAACyMXgDODjjn4/LvzcAAOgFgzeA\ngzP+F+H4F3YBAL1g8AZwkM6ePTt8/fXXm18BAOgBgzeAg/TCCy8Mn3zyyeZXAAB6wOAN4CCdO3du\neP311ze/AgDQAwZvAAfp/PnzwzPPPLP5FQCAHjB4AzhIFy9eHB599NHNrwAA9IDBG8BBunTp0uaf\nZbZfAQDoAYM3gIN05cqV4Z577tn8CgBADxi8ARykq1evbn6Gt/0KAEAPGLwBHKRr164Nd9111+ZX\nAAB6wOAN4CBdv359uPPOOze/AgDQAwZvAAfpxo0bwx133LH5FQCAHjB4AzhIN2/eHE6fPr35FQCA\nHjB4AzhIt2/fHk6dOrX5FQCAHjB4AzhYNngDANALBm8AAAAgAIM3AAAAEIDBGwAAAAjA4A0AAAAE\nYPAGAAAAAjB4AwAAAAEYvAEAAIAADN4AAABAAAZvAAAAIACDNwAAABCAwRsAAAAIwOANAAAABGDw\nBgAAAAIweAMAAAABGLwBAACAAAzeAAAAQAAGbwAAACAAgzcAAAAQgMEbQLhvv/12+Pzzz2dlfzbD\nDz/8MHz66afDW2+9Nbzyyiub3n333eHLL7/cfgQAAEdj8AYQzgboU6dOzcoG30i3bt3aDNj33nuv\n3I9lHwMAwD4M3gDC2VlrG2ZVZZhV77NsaI9iA7Wd2bb9PPHEE5sz3rZ3+33LznbbEwEGbwDAFAze\nALpSzizbpR3ZytD9/PPPM1wDABZj8AbQlV4G73I5jJ3pZugGALTA4A2gK70M3g8//PBmH5cvX97+\nDgAAyzB4A+hKD4O3Xbtte7BLTQAAaIXBG0BXehi87RsmbQ/8qEAAQEsM3gC60sPgXS4zyb7cBQBw\nWBi8AXRlzuBt12Hb2ena1D/GY99IaevbPsrbH3zwweabLO33LPspJ/ajDfmmSwBADQZvAF2ZM3iX\nH/tXmw3Qu2wYt/eVn2ZiH2Nv277s98rZ8PJ7fPMlAGAqBm8AXZkzeNvwW/5J+ZrsrPcu+7tsfRu4\nbaC3/dg/nDM+u23DeRn27f1ckgIAmILBG0BX5gzeLdkwbuuXoVpdjlKUs+HR/4w9AOB4YvAG0JWe\nBm+7tvsotsfysVzvDQDYh8EbQFd6Gryn7IF/aAcAMBWDN4CuZA/e5RpvG6inKJeb2DXjAAAchcEb\nQFfmDN7lmyBrU/8ypV0yYuvb+6co32TJ4A0A2IfBG0BXbOCtHbztWmw781yb/SxupeYf0LG/xz5W\n/YQUAADGGLwBdGXO4N2aDeS2B/sxgkexs+Pl7HnmfgEAxwODN4Cu9DB4l39Ex/ZyFDvTbh+nLlkB\nAGAXgzeArvQweJty7bZdSqLY2fBytvuon/UNAEDB4A2gK70M3nYZif0T8bYX+9XObtt13PZNlOW6\nbtsr13YDAKZi8AbQlV4Gb2PDt/2rlLaf3Wz45kw3AKAGgzeArtiwW+qF7cXOdNvlJRYDNwBgDgZv\nAAAAIACDNwAAABCAwRsAAAAIwOANAAAABGDwBgAAAAIweAMAAAABGLwBAACAAAzeAAAAQAAGbwAA\nACAAgzcAAAAQgMEbAAAACMDgDQAAAARg8AYAAAACMHgDAAAAARi8AQAAgNUNw/8DOEofgioOKPkA\nAAAASUVORK5CYII=\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Image('./images/one_step_forecast.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "T = 6\n",
    "HORIZON = 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our data preparation for the training set will involve the following steps:\n",
    "\n",
    "1. Filter the original dataset to include only that time period reserved for the training set\n",
    "2. Scale the time series such that the values fall within the interval (0, 1)\n",
    "3. Shift the values of the time series to create a Pandas dataframe containing all the data for a single training example\n",
    "4. Discard any samples with missing values\n",
    "5. Transform this Pandas dataframe into a numpy array of shape (samples, features) for input into Keras"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Filter the original dataset to include only that time period reserved for the training set"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Create training set containing only the model features"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "train = energy.copy()[energy.index < valid_start_dt][['load']]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. Scale the time series such that the values fall within the interval (0, 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Scale data to be in range (0, 1). This transformation should be calibrated on the training set only. This is to prevent information from the validation or test sets leaking into the training data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>load</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2012-01-01 00:00:00</th>\n",
       "      <td>0.22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 01:00:00</th>\n",
       "      <td>0.18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 02:00:00</th>\n",
       "      <td>0.14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 03:00:00</th>\n",
       "      <td>0.13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 04:00:00</th>\n",
       "      <td>0.13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 05:00:00</th>\n",
       "      <td>0.15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 06:00:00</th>\n",
       "      <td>0.18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 07:00:00</th>\n",
       "      <td>0.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 08:00:00</th>\n",
       "      <td>0.29</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 09:00:00</th>\n",
       "      <td>0.35</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     load\n",
       "2012-01-01 00:00:00  0.22\n",
       "2012-01-01 01:00:00  0.18\n",
       "2012-01-01 02:00:00  0.14\n",
       "2012-01-01 03:00:00  0.13\n",
       "2012-01-01 04:00:00  0.13\n",
       "2012-01-01 05:00:00  0.15\n",
       "2012-01-01 06:00:00  0.18\n",
       "2012-01-01 07:00:00  0.23\n",
       "2012-01-01 08:00:00  0.29\n",
       "2012-01-01 09:00:00  0.35"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.preprocessing import MinMaxScaler\n",
    "scaler = MinMaxScaler()\n",
    "train['load'] = scaler.fit_transform(train)\n",
    "train.head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Original vs scaled data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x19ad0eb5d30>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x19ad0eb5e48>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "energy[energy.index < valid_start_dt][['load']].rename(columns={'load':'original load'}).plot.hist(bins=100, fontsize=12)\n",
    "train.rename(columns={'load':'scaled load'}).plot.hist(bins=100, fontsize=12)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. Shift the values of the time series to create a Pandas dataframe containing all the data for a single training example"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, we create the target (*y_t+1*) variable. If we use the convention that the dataframe is indexed on time *t*, we need to shift the *load* variable forward one hour in time. Using the freq parameter we can tell Pandas that the frequency of the time series is hourly. This ensures the shift does not jump over any missing periods in the time series."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>load</th>\n",
       "      <th>y_t+1</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2012-01-01 00:00:00</th>\n",
       "      <td>0.22</td>\n",
       "      <td>0.18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 01:00:00</th>\n",
       "      <td>0.18</td>\n",
       "      <td>0.14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 02:00:00</th>\n",
       "      <td>0.14</td>\n",
       "      <td>0.13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 03:00:00</th>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 04:00:00</th>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 05:00:00</th>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 06:00:00</th>\n",
       "      <td>0.18</td>\n",
       "      <td>0.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 07:00:00</th>\n",
       "      <td>0.23</td>\n",
       "      <td>0.29</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 08:00:00</th>\n",
       "      <td>0.29</td>\n",
       "      <td>0.35</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 09:00:00</th>\n",
       "      <td>0.35</td>\n",
       "      <td>0.37</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     load  y_t+1\n",
       "2012-01-01 00:00:00  0.22   0.18\n",
       "2012-01-01 01:00:00  0.18   0.14\n",
       "2012-01-01 02:00:00  0.14   0.13\n",
       "2012-01-01 03:00:00  0.13   0.13\n",
       "2012-01-01 04:00:00  0.13   0.15\n",
       "2012-01-01 05:00:00  0.15   0.18\n",
       "2012-01-01 06:00:00  0.18   0.23\n",
       "2012-01-01 07:00:00  0.23   0.29\n",
       "2012-01-01 08:00:00  0.29   0.35\n",
       "2012-01-01 09:00:00  0.35   0.37"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_shifted = train.copy()\n",
    "train_shifted['y_t+1'] = train_shifted['load'].shift(-1, freq='H')\n",
    "train_shifted.head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We also need to shift the load variable back 6 times to create the input sequence:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "for t in range(1, T+1):\n",
    "    train_shifted[str(T-t)] = train_shifted['load'].shift(T-t, freq='H')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>load_original</th>\n",
       "      <th>y_t+1</th>\n",
       "      <th>load_t-5</th>\n",
       "      <th>load_t-4</th>\n",
       "      <th>load_t-3</th>\n",
       "      <th>load_t-2</th>\n",
       "      <th>load_t-1</th>\n",
       "      <th>load_t</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2012-01-01 00:00:00</th>\n",
       "      <td>0.22</td>\n",
       "      <td>0.18</td>\n",
       "      <td>nan</td>\n",
       "      <td>nan</td>\n",
       "      <td>nan</td>\n",
       "      <td>nan</td>\n",
       "      <td>nan</td>\n",
       "      <td>0.22</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 01:00:00</th>\n",
       "      <td>0.18</td>\n",
       "      <td>0.14</td>\n",
       "      <td>nan</td>\n",
       "      <td>nan</td>\n",
       "      <td>nan</td>\n",
       "      <td>nan</td>\n",
       "      <td>0.22</td>\n",
       "      <td>0.18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 02:00:00</th>\n",
       "      <td>0.14</td>\n",
       "      <td>0.13</td>\n",
       "      <td>nan</td>\n",
       "      <td>nan</td>\n",
       "      <td>nan</td>\n",
       "      <td>0.22</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.14</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 03:00:00</th>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "      <td>nan</td>\n",
       "      <td>nan</td>\n",
       "      <td>0.22</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.14</td>\n",
       "      <td>0.13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 04:00:00</th>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "      <td>nan</td>\n",
       "      <td>0.22</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.14</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 05:00:00</th>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.22</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.14</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 06:00:00</th>\n",
       "      <td>0.18</td>\n",
       "      <td>0.23</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.14</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 07:00:00</th>\n",
       "      <td>0.23</td>\n",
       "      <td>0.29</td>\n",
       "      <td>0.14</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 08:00:00</th>\n",
       "      <td>0.29</td>\n",
       "      <td>0.35</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.23</td>\n",
       "      <td>0.29</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 09:00:00</th>\n",
       "      <td>0.35</td>\n",
       "      <td>0.37</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.23</td>\n",
       "      <td>0.29</td>\n",
       "      <td>0.35</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     load_original  y_t+1  load_t-5  load_t-4  load_t-3  \\\n",
       "2012-01-01 00:00:00           0.22   0.18       nan       nan       nan   \n",
       "2012-01-01 01:00:00           0.18   0.14       nan       nan       nan   \n",
       "2012-01-01 02:00:00           0.14   0.13       nan       nan       nan   \n",
       "2012-01-01 03:00:00           0.13   0.13       nan       nan      0.22   \n",
       "2012-01-01 04:00:00           0.13   0.15       nan      0.22      0.18   \n",
       "2012-01-01 05:00:00           0.15   0.18      0.22      0.18      0.14   \n",
       "2012-01-01 06:00:00           0.18   0.23      0.18      0.14      0.13   \n",
       "2012-01-01 07:00:00           0.23   0.29      0.14      0.13      0.13   \n",
       "2012-01-01 08:00:00           0.29   0.35      0.13      0.13      0.15   \n",
       "2012-01-01 09:00:00           0.35   0.37      0.13      0.15      0.18   \n",
       "\n",
       "                     load_t-2  load_t-1  load_t  \n",
       "2012-01-01 00:00:00       nan       nan    0.22  \n",
       "2012-01-01 01:00:00       nan      0.22    0.18  \n",
       "2012-01-01 02:00:00      0.22      0.18    0.14  \n",
       "2012-01-01 03:00:00      0.18      0.14    0.13  \n",
       "2012-01-01 04:00:00      0.14      0.13    0.13  \n",
       "2012-01-01 05:00:00      0.13      0.13    0.15  \n",
       "2012-01-01 06:00:00      0.13      0.15    0.18  \n",
       "2012-01-01 07:00:00      0.15      0.18    0.23  \n",
       "2012-01-01 08:00:00      0.18      0.23    0.29  \n",
       "2012-01-01 09:00:00      0.23      0.29    0.35  "
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_col = 'y_t+1'\n",
    "X_cols = ['load_t-5',\n",
    "          'load_t-4',\n",
    "          'load_t-3',\n",
    "          'load_t-2',\n",
    "          'load_t-1',\n",
    "          'load_t']\n",
    "train_shifted.columns = ['load_original']+[y_col]+X_cols\n",
    "train_shifted.head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. Discard any samples with missing values"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Notice how we have missing values for the input sequences for the first 5 samples. We will discard these:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>load_original</th>\n",
       "      <th>y_t+1</th>\n",
       "      <th>load_t-5</th>\n",
       "      <th>load_t-4</th>\n",
       "      <th>load_t-3</th>\n",
       "      <th>load_t-2</th>\n",
       "      <th>load_t-1</th>\n",
       "      <th>load_t</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2012-01-01 05:00:00</th>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.22</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.14</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 06:00:00</th>\n",
       "      <td>0.18</td>\n",
       "      <td>0.23</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.14</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 07:00:00</th>\n",
       "      <td>0.23</td>\n",
       "      <td>0.29</td>\n",
       "      <td>0.14</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 08:00:00</th>\n",
       "      <td>0.29</td>\n",
       "      <td>0.35</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.23</td>\n",
       "      <td>0.29</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 09:00:00</th>\n",
       "      <td>0.35</td>\n",
       "      <td>0.37</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.23</td>\n",
       "      <td>0.29</td>\n",
       "      <td>0.35</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     load_original  y_t+1  load_t-5  load_t-4  load_t-3  \\\n",
       "2012-01-01 05:00:00           0.15   0.18      0.22      0.18      0.14   \n",
       "2012-01-01 06:00:00           0.18   0.23      0.18      0.14      0.13   \n",
       "2012-01-01 07:00:00           0.23   0.29      0.14      0.13      0.13   \n",
       "2012-01-01 08:00:00           0.29   0.35      0.13      0.13      0.15   \n",
       "2012-01-01 09:00:00           0.35   0.37      0.13      0.15      0.18   \n",
       "\n",
       "                     load_t-2  load_t-1  load_t  \n",
       "2012-01-01 05:00:00      0.13      0.13    0.15  \n",
       "2012-01-01 06:00:00      0.13      0.15    0.18  \n",
       "2012-01-01 07:00:00      0.15      0.18    0.23  \n",
       "2012-01-01 08:00:00      0.18      0.23    0.29  \n",
       "2012-01-01 09:00:00      0.23      0.29    0.35  "
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_shifted = train_shifted.dropna(how='any')\n",
    "train_shifted.head(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Transform into a numpy arrays of shapes (samples, features) and (samples,1) for input into Keras"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now convert the target and input features into numpy arrays. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_train = train_shifted[[y_col]].as_matrix()\n",
    "X_train = train_shifted[X_cols].as_matrix()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We now have a vector for target variable of shape:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(23370, 1)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The target varaible for the first 3 samples looks like:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.18],\n",
       "       [0.23],\n",
       "       [0.29]])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train[:3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The tensor for the input features now has the shape:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(23370, 6)"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "And the first 3 samples looks like:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0.22, 0.18, 0.14, 0.13, 0.13, 0.15],\n",
       "       [0.18, 0.14, 0.13, 0.13, 0.15, 0.18],\n",
       "       [0.14, 0.13, 0.13, 0.15, 0.18, 0.23]])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train[:3]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can sense check this against the first 3 records of the original dataframe:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>load_original</th>\n",
       "      <th>y_t+1</th>\n",
       "      <th>load_t-5</th>\n",
       "      <th>load_t-4</th>\n",
       "      <th>load_t-3</th>\n",
       "      <th>load_t-2</th>\n",
       "      <th>load_t-1</th>\n",
       "      <th>load_t</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2012-01-01 05:00:00</th>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.22</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.14</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 06:00:00</th>\n",
       "      <td>0.18</td>\n",
       "      <td>0.23</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.14</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2012-01-01 07:00:00</th>\n",
       "      <td>0.23</td>\n",
       "      <td>0.29</td>\n",
       "      <td>0.14</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.13</td>\n",
       "      <td>0.15</td>\n",
       "      <td>0.18</td>\n",
       "      <td>0.23</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     load_original  y_t+1  load_t-5  load_t-4  load_t-3  \\\n",
       "2012-01-01 05:00:00           0.15   0.18      0.22      0.18      0.14   \n",
       "2012-01-01 06:00:00           0.18   0.23      0.18      0.14      0.13   \n",
       "2012-01-01 07:00:00           0.23   0.29      0.14      0.13      0.13   \n",
       "\n",
       "                     load_t-2  load_t-1  load_t  \n",
       "2012-01-01 05:00:00      0.13      0.13    0.15  \n",
       "2012-01-01 06:00:00      0.13      0.15    0.18  \n",
       "2012-01-01 07:00:00      0.15      0.18    0.23  "
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_shifted.head(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Data preparation - validation set"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we follow a similar process for the validation set. We keep *T* hours from the training set in order to construct initial features."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>load</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2014-08-31 19:00:00</th>\n",
       "      <td>3,969.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-08-31 20:00:00</th>\n",
       "      <td>3,869.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-08-31 21:00:00</th>\n",
       "      <td>3,643.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-08-31 22:00:00</th>\n",
       "      <td>3,365.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-08-31 23:00:00</th>\n",
       "      <td>3,097.00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                        load\n",
       "2014-08-31 19:00:00 3,969.00\n",
       "2014-08-31 20:00:00 3,869.00\n",
       "2014-08-31 21:00:00 3,643.00\n",
       "2014-08-31 22:00:00 3,365.00\n",
       "2014-08-31 23:00:00 3,097.00"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "look_back_dt = dt.datetime.strptime(valid_start_dt, '%Y-%m-%d %H:%M:%S') - dt.timedelta(hours=T-1)\n",
    "valid = energy.copy()[(energy.index >=look_back_dt) & (energy.index < test_start_dt)][['load']]\n",
    "valid.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Scale the series using the transformer fitted on the training set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>load</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2014-08-31 19:00:00</th>\n",
       "      <td>0.61</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-08-31 20:00:00</th>\n",
       "      <td>0.58</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-08-31 21:00:00</th>\n",
       "      <td>0.51</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-08-31 22:00:00</th>\n",
       "      <td>0.43</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2014-08-31 23:00:00</th>\n",
       "      <td>0.34</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                     load\n",
       "2014-08-31 19:00:00  0.61\n",
       "2014-08-31 20:00:00  0.58\n",
       "2014-08-31 21:00:00  0.51\n",
       "2014-08-31 22:00:00  0.43\n",
       "2014-08-31 23:00:00  0.34"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "valid['load'] = scaler.transform(valid)\n",
    "valid.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Prepare validation inputs in the same way as the training set:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "valid_shifted = valid.copy()\n",
    "valid_shifted['y+1'] = valid_shifted['load'].shift(-1, freq='H')\n",
    "for t in range(1, T+1):\n",
    "    valid_shifted['load_t-'+str(T-t)] = valid_shifted['load'].shift(T-t, freq='H')\n",
    "valid_shifted = valid_shifted.dropna(how='any')\n",
    "y_valid = valid_shifted['y+1'].as_matrix()\n",
    "X_valid = valid_shifted[['load_t-'+str(T-t) for t in range(1, T+1)]].as_matrix()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1463,)"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_valid.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(1463, 6)"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_valid.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Implement Feedforward Neural Network"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We implement feed-forward neural network with the 6 inputs, 3 hidden layers, 5 neurons in eachhidden layer and one neuron in output layer."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "from keras import regularizers\n",
    "from keras.models import Model, Sequential\n",
    "from keras.layers import Dense\n",
    "from keras.callbacks import EarlyStopping, ModelCheckpoint\n",
    "from keras import initializers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "LATENT_DIM = 5 # number of units in the dense layer\n",
    "BATCH_SIZE = 32 # number of samples per mini-batch\n",
    "EPOCHS = 50 # maximum number of times the training algorithm will cycle through all samples"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Quiz: Run the code below with initializers.Zeros() , initializers.RandomNormal() and initializers.glorot_uniform(). Check MAPE value at the end of the notebook."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "model = Sequential()\n",
    "init = initializers.glorot_uniform()   # CHANGE ONLY THIS LINE\n",
    "model.add(Dense(LATENT_DIM, activation=\"relu\", input_shape=(T,), \n",
    "                kernel_initializer=init,bias_initializer=init))\n",
    "model.add(Dense(HORIZON))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Use RMSprop optimizer and mean squared error as the loss function. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "model.compile(optimizer='RMSprop', loss='mse')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "model.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Early stopping trick"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Image('./images/early_stopping.png')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Specify the early stopping criteria. We **monitor** the validation loss (in this case the mean squared error) on the validation set after each training epoch. If the validation loss has not improved by **min_delta** after **patience** epochs, we stop the training."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "earlystop = EarlyStopping(monitor='val_loss', min_delta=0, patience=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "best_val = ModelCheckpoint('model_{epoch:02d}.h5', save_best_only=True, mode='min', period=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "history = model.fit(X_train,\n",
    "                    y_train,\n",
    "                    batch_size=BATCH_SIZE,\n",
    "                    epochs=EPOCHS,\n",
    "                    validation_data=(X_valid, y_valid),\n",
    "                    callbacks=[earlystop, best_val],\n",
    "                    verbose=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Load the model with the smallest mape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "best_epoch = np.argmin(np.array(history.history['val_loss']))+1\n",
    "model.load_weights(\"model_{:02d}.h5\".format(best_epoch))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "plot training and validation losses"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "plot_df = pd.DataFrame.from_dict({'train_loss':history.history['loss'], 'val_loss':history.history['val_loss']})\n",
    "plot_df.plot(logy=True, figsize=(10,10), fontsize=12)\n",
    "plt.xlabel('epoch', fontsize=12)\n",
    "plt.ylabel('loss', fontsize=12)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "clean up model files"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "for m in glob('model_*.h5'):\n",
    "    os.remove(m)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Evaluate the model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Create the test set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "look_back_dt = dt.datetime.strptime(test_start_dt, '%Y-%m-%d %H:%M:%S') - dt.timedelta(hours=T-1)\n",
    "test = energy.copy()[test_start_dt:][['load']]\n",
    "test.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Scale the test data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "test['load'] = scaler.transform(test)\n",
    "test.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Create test set features"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "test_shifted = test.copy()\n",
    "test_shifted['y_t+1'] = test_shifted['load'].shift(-1, freq='H')\n",
    "for t in range(1, T+1):\n",
    "    test_shifted['load_t-'+str(T-t)] = test_shifted['load'].shift(T-t, freq='H')\n",
    "test_shifted = test_shifted.dropna(how='any')\n",
    "y_test = test_shifted['y_t+1'].as_matrix()\n",
    "X_test = test_shifted[['load_t-'+str(T-t) for t in range(1, T+1)]].as_matrix()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Make predictions on test set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "predictions = model.predict(X_test)\n",
    "predictions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Compare predictions to actual load"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "eval_df = pd.DataFrame(predictions, columns=['t+'+str(t) for t in range(1, HORIZON+1)])\n",
    "eval_df['timestamp'] = test_shifted.index\n",
    "eval_df = pd.melt(eval_df, id_vars='timestamp', value_name='prediction', var_name='h')\n",
    "eval_df['actual'] = np.transpose(y_test).ravel()\n",
    "eval_df[['prediction', 'actual']] = scaler.inverse_transform(eval_df[['prediction', 'actual']])\n",
    "eval_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Compute the mean absolute percentage error over all predictions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "mape(eval_df['prediction'], eval_df['actual'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
